iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

自我挑戰Ruby系列 第 24

Day 24 - 區塊2

  • 分享至 

  • xImage
  •  

yield

上一篇提到過Block不能單獨執行,所以當我們定義一個fix方法後,

呼叫方法之後,後面再使用的Block,會沒有辦法執行,例如:

def fix
   puts "fix this thing"
end

fix {
   puts "Done!"
}

只會印出 fix this thing,

這邊Block那區的 { puts "Done!" }是不會執行的,

因為Block不能單獨執行。

但當我們使用yield,就可以把控制權讓出來,

當使用yield就一定會執行,我們可以藉由yield把控制權讓給後面的Block,例如:

def fix
   puts "fix this thing"
   yield
   puts "OK!"
end

fix {
   puts "Done!"
}

當我們呼叫fix方法時,

會先印出fix this thing,

藉由yield先將控制權給呼叫fix方法時後面的Block 那區的 { puts "Done!" },

所以接下來會印出Done!,

當執行完Block那一區後又會回到fix方法的yield後面,印出OK!。

所以整體會印出:fix this thing,再印出Done!,最後印出OK!。

yield 除了將控制權給Block以外,

如果yield後面接的值,也會一併將值帶入Block內,例如:

def fix
   puts "fix this thing"
   yield 999
   puts "OK!"
end

fix { |x|
   puts "Done!This is number #{x}"
}

這裡會將999帶入Block內的x中,

所以整體會印出:fix this thing,

再印出Done!This is number 999,

最後印出OK!。

使用yield後面一定要有Block,

如果沒有Block,會有錯誤訊息,

但如果藉由blockgiven? 使後面不會有錯誤,例如:

def fix
   yield if block_given?
end

fix

呼叫fix函數後面沒給定Block就不會有錯誤訊息。

Day 24 結語

我們可以藉由yield將控制權讓給後面的Block,

也可以將值帶回Block內,

藉由yield將後面那個Block可以使用,

解決了Block不能單獨使用的原則。


上一篇
Day 23 - 區塊1
下一篇
Day 25 - 物件化區塊
系列文
自我挑戰Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言